package com.kamistoat.ruoyi.ruoyimodulessystem.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.kamistoat.ruoyi.ruoyiapisystem.domain.SysMenu;
import com.kamistoat.ruoyi.ruoyicommoncore.utils.page.PageUtils;
import com.kamistoat.ruoyi.ruoyiapisystem.entity.SysMenuEntity;
import com.kamistoat.ruoyi.ruoyimodulessystem.vo.RouterVo;
import com.kamistoat.ruoyi.ruoyimodulessystem.vo.TreeSelect;

import java.util.List;
import java.util.Map;

/**
 * 菜单权限表
 *
 * @author kamistoat
 * @email linjianshanke@163.com
 * @date 2022-08-09 10:34:46
 */
public interface SysMenuService extends IService<SysMenuEntity> {

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 获取用户拥有的所有菜单权限列表
     */
    List<SysMenuEntity> selectMenuList(SysMenu sysMenu, Long userId);

    /**
     * 获取指定用户拥有的normal菜单权限列表。注意和上面的区别。用户首先拥有未禁用的角色，然后根据角色查询未禁用的菜单权限
     */
    List<SysMenuEntity> selectMenuListUnderNormal(Long userId);

    /**
     * 根据菜单权限编号获取详细信息。
     * 当然前提是用户本身得拥有这项菜单权限
     * 该接口只会被当前正在登录的用户调用
     */
    SysMenuEntity selectMenuById(Long menuId);

    /**
     * 构建用户拥有的菜单权限的树形结构。和构建树形部门基本就是完全一样的逻辑
     */
    List<TreeSelect> buildMenuTreeSelect(List<SysMenu> sysMenuList);

    List<Long> selectMenuListByRoleId(Long roleId);

    boolean checkMenuNameUnique(SysMenu menu);

    boolean hasChildByMenuId(Long menuId);

    boolean checkMenuExistRole(Long menuId);

    /**
     * 构造成路由结构
     */
    List<RouterVo> buildMenuRouters(List<SysMenu> sysMenuList);

    /**
     * 构造导航路由结构。获取指定父路由下的子路由
     * @param i
     * @return
     */
    List<SysMenu> getChildPerms(List<SysMenu> sysMenuList, Long i);

    /**
     * 添加新的权限。并删除缓存中的核心用户令牌，以保证下次请求能重新构建权限
     * 该接口只会被超级管理员调用
     */
    boolean saveAndRefreshCache(SysMenuEntity sysMenuEntity);
}

